<?php
/**
 * KeywordsApi
 * PHP version 5
 *
 * @category Class
 * @package  AmazonAdvertisingApi
 * @author   vv_guo
 * @link    https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 */

/**
 * Amazon Ads API - Sponsored Brands
 *
 * Use the Amazon Ads API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the [Sponsored Brands Support Center](https://advertising.amazon.com/help#GQFZA83P55P747BZ). For onboarding information, see the [account setup](https://advertising.amazon.com/API/docs/v3/guides/account_setup) topic.
 *
 * OpenAPI spec version: 3.0
 * 
 * Generated by:https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api.git
 * AmazonAdvertisingApi Codegen version: 3.0.51
 */
/**
 * NOTE: This class is auto generated by the AmazonAdvertisingApi code generator program.
 *https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 * Do not edit the class manually.
 */

namespace AmazonAdvertisingApi\Api;

use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Psr7\MultipartStream;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\RequestOptions;
use AmazonAdvertisingApi\ApiException;
use AmazonAdvertisingApi\Configuration;
use AmazonAdvertisingApi\HeaderSelector;
use AmazonAdvertisingApi\ObjectSerializer;

/**
 * KeywordsApi Class Doc Comment
 *
 * @category Class
 * @package  AmazonAdvertisingApi
 * @author   vv_guo
 * @link    https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 */
class KeywordsApi
{
    /**
     * @var ClientInterface
     */
    protected $client;

    /**
     * @var Configuration
     */
    protected $config;

    /**
     * @var HeaderSelector
     */
    protected $headerSelector;

    /**
     * @param ClientInterface $client
     * @param Configuration   $config
     * @param HeaderSelector  $selector
     */
    public function __construct(
        ClientInterface $client = null,
        Configuration $config = null,
        HeaderSelector $selector = null
    ) {
        $this->client = $client ?: new Client();
        $this->config = $config ?: new Configuration();
        $this->headerSelector = $selector ?: new HeaderSelector();
    }

    /**
     * @return Configuration
     */
    public function getConfig()
    {
        return $this->config;
    }

    /**
     * Operation archiveKeyword
     *
     * Archives a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id keyword_id (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeywordResponse
     */
    public function archiveKeyword($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        list($response) = $this->archiveKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);
        return $response;
    }

    /**
     * Operation archiveKeywordWithHttpInfo
     *
     * Archives a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeywordResponse, HTTP status code, HTTP response headers (array of strings)
     */
    public function archiveKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->archiveKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeywordResponse',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation archiveKeywordAsync
     *
     * Archives a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function archiveKeywordAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        return $this->archiveKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation archiveKeywordAsyncWithHttpInfo
     *
     * Archives a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function archiveKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->archiveKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'archiveKeyword'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function archiveKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling archiveKeyword'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling archiveKeyword'
            );
        }
        // verify the required parameter 'keyword_id' is set
        if ($keyword_id === null || (is_array($keyword_id) && count($keyword_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $keyword_id when calling archiveKeyword'
            );
        }

        $resourcePath = '/sb/keywords/{keywordId}';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }

        // path params
        if ($keyword_id !== null) {
            $resourcePath = str_replace(
                '{' . 'keywordId' . '}',
                ObjectSerializer::toPathValue($keyword_id),
                $resourcePath
            );
        }

        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeywordresponse.v3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeywordresponse.v3+json', 'application/vnd.error.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'DELETE',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation createKeywords
     *
     * Creates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody1[] $body An array of keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeywordResponse
     */
    public function createKeywords($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->createKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation createKeywordsWithHttpInfo
     *
     * Creates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody1[] $body An array of keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeywordResponse, HTTP status code, HTTP response headers (array of strings)
     */
    public function createKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->createKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeywordResponse',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation createKeywordsAsync
     *
     * Creates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody1[] $body An array of keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createKeywordsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->createKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation createKeywordsAsyncWithHttpInfo
     *
     * Creates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody1[] $body An array of keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->createKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'createKeywords'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody1[] $body An array of keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function createKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling createKeywords'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling createKeywords'
            );
        }

        $resourcePath = '/sb/keywords';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeywordresponse.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeywordresponse.v3+json'],
                ['application/json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'POST',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation getKeyword
     *
     * Gets a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing keyword. (required)
     * @param  string $locale The returned array includes only keywords associated with locale matching those specified by identifier. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeyword
     */
    public function getKeyword($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale = null)
    {
        list($response) = $this->getKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale);
        return $response;
    }

    /**
     * Operation getKeywordWithHttpInfo
     *
     * Gets a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing keyword. (required)
     * @param  string $locale The returned array includes only keywords associated with locale matching those specified by identifier. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeyword, HTTP status code, HTTP response headers (array of strings)
     */
    public function getKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeyword';
        $request = $this->getKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeyword',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation getKeywordAsync
     *
     * Gets a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing keyword. (required)
     * @param  string $locale The returned array includes only keywords associated with locale matching those specified by identifier. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function getKeywordAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale = null)
    {
        return $this->getKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation getKeywordAsyncWithHttpInfo
     *
     * Gets a keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing keyword. (required)
     * @param  string $locale The returned array includes only keywords associated with locale matching those specified by identifier. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function getKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeyword';
        $request = $this->getKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'getKeyword'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing keyword. (required)
     * @param  string $locale The returned array includes only keywords associated with locale matching those specified by identifier. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function getKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id, $locale = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling getKeyword'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling getKeyword'
            );
        }
        // verify the required parameter 'keyword_id' is set
        if ($keyword_id === null || (is_array($keyword_id) && count($keyword_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $keyword_id when calling getKeyword'
            );
        }

        $resourcePath = '/sb/keywords/{keywordId}';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // query params
        if ($locale !== null) {
            $queryParams['locale'] = ObjectSerializer::toQueryValue($locale, null);
        }
        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }

        // path params
        if ($keyword_id !== null) {
            $resourcePath = str_replace(
                '{' . 'keywordId' . '}',
                ObjectSerializer::toPathValue($keyword_id),
                $resourcePath
            );
        }

        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeyword.v3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeyword.v3+json', 'application/vnd.error.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'GET',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation listKeywords
     *
     * Gets an array of keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\MatchType $match_type_filter The returned array is filtered to include only keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only keywords with the specified text. (optional)
     * @param  string $state_filter The returned array is filtered to include only keywords with &#x27;state&#x27; set to one of the values in the specified comma-delimited list. (optional, default to enabled,paused)
     * @param  string $campaign_id_filter The returned array includes only keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all keywords if not specified. (optional)
     * @param  string $locale The returned array includes only keywords with locale matching those specified string. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeyword[]
     */
    public function listKeywords($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = 'enabled,paused', $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null, $locale = null)
    {
        list($response) = $this->listKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type, $locale);
        return $response;
    }

    /**
     * Operation listKeywordsWithHttpInfo
     *
     * Gets an array of keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\MatchType $match_type_filter The returned array is filtered to include only keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only keywords with the specified text. (optional)
     * @param  string $state_filter The returned array is filtered to include only keywords with &#x27;state&#x27; set to one of the values in the specified comma-delimited list. (optional, default to enabled,paused)
     * @param  string $campaign_id_filter The returned array includes only keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all keywords if not specified. (optional)
     * @param  string $locale The returned array includes only keywords with locale matching those specified string. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeyword[], HTTP status code, HTTP response headers (array of strings)
     */
    public function listKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = 'enabled,paused', $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null, $locale = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeyword[]';
        $request = $this->listKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type, $locale);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeyword[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation listKeywordsAsync
     *
     * Gets an array of keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\MatchType $match_type_filter The returned array is filtered to include only keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only keywords with the specified text. (optional)
     * @param  string $state_filter The returned array is filtered to include only keywords with &#x27;state&#x27; set to one of the values in the specified comma-delimited list. (optional, default to enabled,paused)
     * @param  string $campaign_id_filter The returned array includes only keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all keywords if not specified. (optional)
     * @param  string $locale The returned array includes only keywords with locale matching those specified string. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function listKeywordsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = 'enabled,paused', $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null, $locale = null)
    {
        return $this->listKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type, $locale)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation listKeywordsAsyncWithHttpInfo
     *
     * Gets an array of keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\MatchType $match_type_filter The returned array is filtered to include only keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only keywords with the specified text. (optional)
     * @param  string $state_filter The returned array is filtered to include only keywords with &#x27;state&#x27; set to one of the values in the specified comma-delimited list. (optional, default to enabled,paused)
     * @param  string $campaign_id_filter The returned array includes only keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all keywords if not specified. (optional)
     * @param  string $locale The returned array includes only keywords with locale matching those specified string. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function listKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = 'enabled,paused', $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null, $locale = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeyword[]';
        $request = $this->listKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type, $locale);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'listKeywords'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\MatchType $match_type_filter The returned array is filtered to include only keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only keywords with the specified text. (optional)
     * @param  string $state_filter The returned array is filtered to include only keywords with &#x27;state&#x27; set to one of the values in the specified comma-delimited list. (optional, default to enabled,paused)
     * @param  string $campaign_id_filter The returned array includes only keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all keywords if not specified. (optional)
     * @param  string $locale The returned array includes only keywords with locale matching those specified string. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function listKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = 'enabled,paused', $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null, $locale = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling listKeywords'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling listKeywords'
            );
        }

        $resourcePath = '/sb/keywords';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // query params
        if ($start_index !== null) {
            $queryParams['startIndex'] = ObjectSerializer::toQueryValue($start_index, null);
        }
        // query params
        if ($count !== null) {
            $queryParams['count'] = ObjectSerializer::toQueryValue($count, null);
        }
        // query params
        if ($match_type_filter !== null) {
            $queryParams['matchTypeFilter'] = ObjectSerializer::toQueryValue($match_type_filter, null);
        }
        // query params
        if ($keyword_text !== null) {
            $queryParams['keywordText'] = ObjectSerializer::toQueryValue($keyword_text, null);
        }
        // query params
        if ($state_filter !== null) {
            $queryParams['stateFilter'] = ObjectSerializer::toQueryValue($state_filter, null);
        }
        // query params
        if ($campaign_id_filter !== null) {
            $queryParams['campaignIdFilter'] = ObjectSerializer::toQueryValue($campaign_id_filter, null);
        }
        // query params
        if ($ad_group_id_filter !== null) {
            $queryParams['adGroupIdFilter'] = ObjectSerializer::toQueryValue($ad_group_id_filter, null);
        }
        // query params
        if ($keyword_id_filter !== null) {
            $queryParams['keywordIdFilter'] = ObjectSerializer::toQueryValue($keyword_id_filter, null);
        }
        // query params
        if ($creative_type !== null) {
            $queryParams['creativeType'] = ObjectSerializer::toQueryValue($creative_type, null);
        }
        // query params
        if ($locale !== null) {
            $queryParams['locale'] = ObjectSerializer::toQueryValue($locale, null);
        }
        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeyword.v3.2+json', 'application/vnd.sbkeyword.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeyword.v3.2+json', 'application/vnd.sbkeyword.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'GET',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation updateKeywords
     *
     * Updates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody[] $body An array of keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeywordResponse
     */
    public function updateKeywords($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->updateKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation updateKeywordsWithHttpInfo
     *
     * Updates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody[] $body An array of keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeywordResponse, HTTP status code, HTTP response headers (array of strings)
     */
    public function updateKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->updateKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeywordResponse',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation updateKeywordsAsync
     *
     * Updates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody[] $body An array of keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateKeywordsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->updateKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation updateKeywordsAsyncWithHttpInfo
     *
     * Updates one or more keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody[] $body An array of keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->updateKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'updateKeywords'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbKeywordsBody[] $body An array of keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function updateKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling updateKeywords'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling updateKeywords'
            );
        }

        $resourcePath = '/sb/keywords';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeywordresponse.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeywordresponse.v3+json'],
                ['application/json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'PUT',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Create http client option
     *
     * @throws \RuntimeException on file opening failure
     * @return array of http client options
     */
    protected function createHttpClientOption()
    {
        $options = [];
        if ($this->config->getDebug()) {
            $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a');
            if (!$options[RequestOptions::DEBUG]) {
                throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile());
            }
        }

        return $options;
    }
}
